<?php
C_base::Dy('c.admin.adbase');
class tempgl extends adbase
{
	var $_vpath='admin/temp/';  //定义调用模板所属一级文件夹
	function __construct(){
		parent::__construct();
		$this->titl = '模板管理';
		$this->xurl = '../admin/?act=tempgl'.$this->gnpd;
		$this->tempid = @$this->Ses('admin_tempid');
	}
	
	
	/**
	 * 模板列表
	 */
	function index(){
		$this->tit = '模板列表';
		$cz= C_base::M('admin.tempgl')->temp_ss(array());
		if(@$cz){
			$rs = array();
			foreach ($cz as $k=>$v){
				$rr = 'style/'.$v['temp'].'/index.png';
				$this->rs[$k] = $v;
				$this->rs[$k]['sy_src'] = $this->_url.'/'.$rr;
				if(@file_exists(WEB_DIR.$rr)){
					$this->rs[$k]['lst'] = 1;
				}
			}
		}
	}
	/**
	 * 模板下的文件列表
	 * pa 路径
	 */
	function temp_list(){
		$this->tit = '模板列表';
		$id = $this->id = @$this->_get('id');
		if(@$id){
			$cz= C_base::M('admin.tempgl')->temp_s(array('id'=>$id));
			if($cz){
				$this->Ses('admin_tempid',$id);
				if(@$this->_get('pa')){
					$path = base64_decode($this->_get('pa'));
				}else{
					$path = V_DIR.'html'.DS.$cz['temp'];
				}
				$this->dir = self::dirfile($path,$cz['temp']);
			}
		}else{
			exit('非法操作');
		}
	}
		
	/**
	 * id 模板id
	 * path 路径
	 * 通过路径找下级文件
	 */
	function dirfile($path,$temp){
		$data = @scandir($path);
		if(@$data){
			foreach ($data as $k=>$v){
				if($v != '.' && $v != '..' && $v !='cache'){
					$filepath[$k]['path'] = $path.DS.$v;
					$filepath[$k]['xx'] = self::filetype($path.DS.$v);
					$filepath[$k]['name'] = $v;
					$bb = explode(DS, $path.DS.$v);
					if(@$this->_get('pch') == 1){  //pc
						$pa = WEB_DIR.'style'.DS.$temp.DS.'pc';
					}elseif (@$this->_get('pch') == 2){  //phone
						$pa = WEB_DIR.'style'.DS.$temp.DS.'phone';  //获取项目文件夹下的样式
					}elseif (@$this->_get('pch') == 3){  //weixin
						$pa = WEB_DIR.'style'.DS.$temp.DS.'weixin';  //获取项目文件夹下的样式
					}
					if(@$pa){
						$da = @scandir($pa);
						if($da){
							foreach (@$da as $k1=>$v1){
								if($v1 != "." && $v1 != ".."){
									$filep[$k1]['path'] = $pa.DS.$v1;     //文件路径
									$filep[$k1]['xx'] = self::filetype($pa.DS.$v1);   //文件大小，类型
									$filep[$k1]['name'] = $v1;     //文件名称
									$filep[$k1]['lastime'] = date('Y-m-d H:i:s',filemtime($pa.DS.$v1));  //文件最后修改时间
								}	
							}
						}
					}
					if ($bb[count($bb)-1] == 'pc' && $bb[count($bb)-2] == $temp){
						$rr = 'style/'.$temp.'/pc/index_pc.png';
						$filepath[$k]['sy_src'] = $this->_url.'/'.$rr;   //pc略缩图
						$filepath[$k]['lcv'] =1;
					}elseif ($bb[count($bb)-1] == 'phone' && $bb[count($bb)-2] == $temp){
						$rr = 'style/'.$temp.'/phone/index_phone.png';
						$filepath[$k]['sy_src'] = $this->_url.'/'.$rr;   //phone略缩图
						$filepath[$k]['lcv'] =1;
					}elseif ($bb[count($bb)-1] == 'weixin' && $bb[count($bb)-2] == $temp){
						$rr = 'style/'.$temp.'/weixin/index_weixin.png';
						$filepath[$k]['sy_src'] = $this->_url.'/'.$rr;   //phone略缩图
						$filepath[$k]['lcv'] =1;
					}
					if(@is_file(WEB_DIR.$rr)){
						$filepath[$k]['lst'] = 1;
					}
					$filepath[$k]['lastime'] = date('Y-m-d H:i:s',filemtime($path.DS.$v));
				}
			}
			if (@$filepath && @$filep){
				return array_values(array_merge($filepath,$filep));
			}else if (@$filepath) {
				return $filepath;
			}else{
				return array();
			}
		}else{
			exit('路径错误');
		}
	}
	
	/**
	 * path 路径
	 * 判断文件类型和大小
	 */
	function filetype($path){
		$aa = explode(DS, $path);
		$fname = $aa[count($aa)-1];
		if (is_dir($path)){   //判断给定文件名是否是一个目录
			$filepath['size'] =  self::getRealSize(self::getDirSize($path)); //获取文件夹大小
			if($fname == 'css'){
				$filepath['lx'] = '样式文件夹';
			}elseif ($fname == 'images' || $fname == 'img'){
				$filepath['lx'] = '图片存储文件夹';
			}elseif ($fname == 'js'){
				$filepath['lx'] = 'js文件夹';
			}else{
				$filepath['lx'] = '文件夹';
			}
			$filepath['type'] = 1;
		}else{
			$filepath['size'] = self::getRealSize(filesize($path));     //获取文件大小
			if(strpos($fname,'.html')){
				$filepath['type'] = 2;
				$filepath['lx'] = 'HTML Document';
			}elseif (strpos($fname,'.css')){
				$filepath['type'] = 3;
				$filepath['lx'] = '层叠样式表文档';
			}elseif (strpos($fname,'.js')){
				$filepath['type'] = 3;
				$filepath['lx'] = 'js控制文档';
			}elseif (preg_match('/(jpg|jpeg|png|gif)/isU', $fname)){
				$filepath['type'] = 4;
				$filepath['lx'] = '图片';
			}else{
				$filepath['lx'] = '文件';
			}
		}
		return $filepath;
	}


/************************************************删除文件或文件夹************************************/
	/**
	 * 删除 
	 * 判断是文件还是文件夹
	 */
	function del(){
		$this->_is_html = 1;
		if(!@$this->_post('pa')){
			exit('非法操作');
		}else {
			$path = base64_decode($this->_post('pa'));
			if (is_dir($path)){ //判断是否是一个目录
				self::deldir($path);
			}else{
				unlink($path); //删除文件
			}
			exit('cg');
		}
	}
	
	/**
	 * 删除文件夹--先删除文件
	 * dir  文件夹路径
	 */
	function deldir($dir) {
		$dh=opendir($dir);
		while (@$file = readdir($dh)) {
			if($file!="." && $file!="..") {
				$fullpath=$dir."/".$file;
				if(!is_dir($fullpath)) {
					unlink($fullpath);
				} else {
					$this->deldir($fullpath);
				}
			}
		}
		closedir($dh);
		if(rmdir($dir)) {
			return true;
		}
		return false;
	}
	
/**************************************获取文件夹大小*******************************************/
	/**
	 * 获取文件夹大小
	 * dir 文件路径
	 */
	function getDirSize($dir){
		$handle = opendir($dir);
		$sizeResult = 0;
		while (false!==($FolderOrFile = readdir($handle))){
			if($FolderOrFile != "." && $FolderOrFile != ".."){
				if(is_dir("$dir/$FolderOrFile")){
					$sizeResult += $this->getDirSize("$dir/$FolderOrFile");
				}else{
					$sizeResult += filesize("$dir/$FolderOrFile");
				}
			}
		}
		closedir($handle);
		return $sizeResult;
	}
	// 单位自动转换函数
	function getRealSize($size){
		$kb = 1024;         // Kilobyte
		$mb = 1024 * $kb;   // Megabyte
		$gb = 1024 * $mb;   // Gigabyte
		$tb = 1024 * $gb;   // Terabyte
		if($size < $kb){
			return $size." B";
		}else if($size < $mb){
			return round($size/$kb,2)." KB";
		}else if($size < $gb){
			return round($size/$mb,2)." MB";
		}else if($size < $tb){
			return round($size/$gb,2)." GB";
		}else{
			return round($size/$tb,2)." TB";
		}
	}

/*********************************************改名****************************************/
	/**
	 * 修改名称弹窗
	 * pa 路径
	 */
	function alert(){
		$this->tit = '修改名称';
		if(!@$this->_get('pa')){
			exit('非法操作');
		}else {
			$this->paths = base64_decode($this->_get('pa'));
			$cc = pathinfo($this->paths);
			$this->filename = $cc['filename'];  //文件名称 
		}	
	}
	
	/**
	 * 修改名称
	 * pa 路径
	 * name 名称
	 * rename() 文件冲重命名函数
	 */
	function editname(){
		extract($this->_post());
		if(!@$pa){
			exit('非法操作');
		}else {
			$path = base64_decode($pa);
			$cc = pathinfo($path);
			$name = preg_replace('/[　]+/u', '', $name);
			if (trim($name) == '') {
				exit('文件名称不能为空');
			}
			if($cc['filename'] == @$name){
				exit('原名称与新名称相同');
			}
			if(preg_match('/[\x7f-\xff]/', $name)){
				exit('文件名不能为中文');
			}
			if(!preg_match('/^[a-zA-Z_][a-zA-Z0-9_]/is',$name)){
				exit("文件名以字母或下划线开头，后跟数字，字母，或下划线");
			}
			$aa= str_replace($cc['filename'],$name, $path);
			$cc= @rename($path,$aa);
			if (@$cc){
				exit('cg');
			}else{
				exit('修改失败');
			}
		}
	}

/************************************************在线编辑*****************************************/
	function zxedit(){   //在线编辑
		$this->tit = '在线编辑';
		$this->id = @$this->_get('id');
		if(!@$this->_get('pa') || !@$this->_get('id')){
			exit('非法操作');
		}else {
			if(@$this->_get('id') != $this->Ses('admin_tempid')){
				exit('非法操作');
			}
			$this->cz= C_base::M('admin.tempgl')->temp_s(array('id'=>$this->Ses('admin_tempid')));
			$this->pathc = base64_decode($this->_get('pa'));
			$cc = pathinfo($this->pathc);
			$this->filename = $cc['basename'];   //文件名
			$this->luj = $cc['dirname'];    //路径
			$dd = explode(DS.'sys'.DS.'v'.DS, $cc['dirname']);
			$ff = explode(DS.'sys'.DS.'v'.DS.'html'.DS, $cc['dirname']);
			$zhi = str_replace(DS,'/',$ff[1]);//将'\'替换成'/'
			$this->style = $this->_url.'/style/'.$zhi;			
			$this->me = $dd[1].DS.$cc['filename']; //路径html\two\pc\index
		}
	}
	
/************************************************文本编辑**********************************************/
	function textedit(){   //文本编辑页面
		$this->tit = '文本编辑';
		$this->id = @$this->_get('id');
		if(!@$this->_get('pa') || !@$this->_get('id')){
			exit('非法操作');
		}else {
			if($this->_get('id') != $this->Ses('admin_tempid')){
				exit('非法操作');
			}
			$this->cz= C_base::M('admin.tempgl')->temp_s(array('id'=>$this->Ses('admin_tempid')));
			$this->pathc = base64_decode($this->_get('pa'));
			$cc = pathinfo($this->pathc);
			$this->filename = $cc['basename'];   //文件名
			$this->luj = $cc['dirname'];    //路径
			$this->content =htmlspecialchars(file_get_contents($this->pathc));
		}
	}
	
	function editemp(){   //保存编辑后的模板
		$this->_is_html = 1;
		if(!@$this->_post('pa')){
			exit('非法操作');
		}else {
			$path = base64_decode($this->_post('pa'));
			if (file_exists($path)) {//检查文件是否存在
				file_put_contents($path, $this->_post('content',1));  //对内容不过滤
				exit('保存成功');
			}else{
				exit('失败');
			}
		}
	}

/*********************************************预览******************************************/
 	function book(){
 		$id = @$this->_get('pa');
		if(!@$id){
			exit('非法操作');
		}else {
			$cz= C_base::M('admin.tempgl')->temp_s(array('id'=>$id));
			if($this->_mb == $cz['temp']){
				$this->_alert_location($this->_url);
			}else{
				$this->_cuowu('请将此模板设置为默认模板后在预览');
			}			
		}
	} 
	
/*********************************************切换模板******************************************/
	function qhmb(){
		$id = @$this->_post('id');
		if(!@$id){
			exit('非法操作');
		}else {
			$cz= C_base::M('admin.tempgl')->temp_s(array('id'=>$id));
			$vpath = V_DIR.'html'.DS.$cz['temp'];
			if(file_exists($vpath)){   //存在该模板
				$r = C_base::M('admin.xitonggl')->config_u(array(),array('temp'=>$id));
				if($r){
					exit('cg');
				}else{
					exit('error');
				}
			}else{
				exit('无效模板,刷新后重试');
			}
		}
	}
	
/******************************************预览图片*********************************************/	
	function ylimg(){
		$this->_is_html = 1;
		if(!@$this->_get('pa')){
			exit('非法操作');
		}else {
			$path = base64_decode($this->_get('pa'));
			$aa = file_get_contents($path);
			header('Content-type: image/jpeg');
			print_r($aa);
		}
	}
		
/******************************************导出*************************************************/
	/**
	 * 先拷贝根目录到临时文件夹
	 * 压缩临时文件夹
	 * 下载压缩文件 
	 */
	function daoc(){   //导出
		$this->_is_html = 1;
		$id = @$this->_get('id');
		if(!$id){
			exit('非法操作');
		}else {	
			$cz= C_base::M('admin.tempgl')->temp_s(array('id'=>$id));
			if(@!$cz){
				exit('error');
			}
			$filename = $cz['temp'];   //模板名称
			if($this->_mb != $filename){
				exit('请先将此模板设置为网站默认模板在导出');
			}
			//创建临时文件夹,将根目录下的所有文件copy到临时文件夹，在临时文件夹中进行操作
			$zwj = BATH.'copy_zip'.DS;
			if(!is_dir($zwj)){     //如果新目录不存在
				mkdir($zwj,0777);//创建新目录
			}			
			$dirs = $zwj.$filename;  //临时压缩项目路径
			$fil = $dirs.'.zip';  //压缩文件存储路径
			if(file_exists($dirs)){   //每次导出删除之前的文件
				self::deldir($dirs);				
			}			
			$conn = self::dcwj($id,$filename);
			foreach (@$conn as $k=>$v){
				$vs= BATH.$v;
				if(file_exists($vs)){
					self::copys($vs, $dirs);    //拷贝指定文件
				}
			}
			if(file_exists($dirs)){
				$stys = $dirs.DS.'web'.DS.'style';
				self::zddel_dir($stys,$filename);   //删除style里除去当前模板样式的文件
			}
			$aaa = $this->Tozip($dirs, $fil,'zip');  //压缩成.zip下载
			if($aaa == 'ok'){
				self::deldir($dirs);
				if(is_file($fil)){   //下载
					header("Content-Type: application/zip");  //zip格式的
					header('Content-Disposition: attachment; filename="' . basename($fil) .'"');  //文件名
					header('Content-Transfer-Encoding: binary');  //二进制文件
					header('Content-Length: '.filesize($fil));  // 文件大小
					readfile($fil);
				}else{ 
					exit('目标文件不存在');
				}
			}else{
				exit('下载出错');
			}					
		} 
	} 
	/**
	 * id 导出模板id
	 * filename 模板名称
	 * 导出文件参数
	 */
	function dcwj($id,$filename){
		$name = 'conf_'.$id;
		$dc = V_DIR.'html'.DS.$filename.DS.$name.'.php';
		if(@!file_exists($dc)){   
			exit('核心文件'.$dc.'缺失，导出失败');
		}
		require_once($dc);
		$aa = new $name();
		$conn = util::object_array($aa); //读取配置文件中的数据
		$mb =  C_base::M('admin.tempgl')->temp_s(array('id'=>@$id));  //获取模板功能$mb['gn']
		if(@$mb['gn']){
			$ge = array_filter(explode(',', $mb['gn']));
			foreach ($ge as $k=>$v){
				$wj[]= C_base::M('admin.gongnengl')->gn_s(array('id'=>$v));
			}
			if(@$wj){
				$kk = array();
				foreach ($wj as $k1=>$v1){
					$gg = unserialize($v1['file']);
					foreach ($gg as $k2=>$v2){
						$kk[$k1][$k2.'_'.$v1['id']]=base64_decode($v2);
					}
				}
			}
			if(@$kk){
				foreach ($kk as $k3=>$v3){
					foreach ($v3 as $k4=>$v4){
						$bdwj[$k4] = $v4;
					}
				}
			}
			return array_merge($conn,$bdwj);
		}else{
			return $conn;	
		}
	}
/*************************************拷贝文件*************************************************/
	/**
	 * 拷贝文件
	 * old 老文件路径
	 * new 新文件路径
	 */
	function copys($old,$new){
		if(!strstr($new,'sys') && !strpos($new,'web')){
			$ge = explode('rumicms', $old);
			$new = $new.$ge[1];
		}
		$aa = pathinfo($new);
		if(@$aa['extension']){
			$new = $aa['dirname'];
			$bb = pathinfo($old);
			$dir = @opendir($bb['dirname']);
		}else{
			$dir = @opendir($old);
		}
		if(@!is_dir($new)){     //如果新目录不存在
			$this->makedir($new);
		}
		if(@$aa['extension']){
			copy($old,$new.DS.$aa['basename']);
		}else{
			while (false !== ($file = @readdir($dir))){
				if (($file != '.') && ($file != '..') && (!preg_match('/^\.(\w+)/', $file) && ($file !='copy_zip') )) {
					if (is_dir($old.DS.$file)){
						self::copys($old.DS.$file, $new.DS.$file);
						continue;
					}else{
						if(file_exists($old.DS.$file)){
							copy($old.DS.$file, $new.DS.$file);
						}
					}
				}
			}
		}
		closedir($dir);
	}
	
	/**
	 * path 路径
	 * 创建级联目录
	 */
	function makedir($path){
		if(is_dir($path)){
			return true;
		}
		if (is_dir(dirname($path))){
			return mkdir($path,0777);
		}
		self::makedir(dirname($path));
		return mkdir($path,0777);
	}
	

/*****************************************压缩文件*****************************************************/
	/**
	 * 压缩文件夹
	 * dir 需要压缩的文件名路径
	 * filename 压缩后的zip文件名 包括zip后缀
	 * zip压缩zip文件类型
	 * missfile   不需要的文件,$missfile=array(),$addfromString=array()
	 * addfromString  添加文件到zip压缩包内
	 */
	function Tozip($dir,$filename,$ztype){	
	    if(!file_exists($dir) || !is_dir($dir)){
	        die('不存在目录'.$dir);
	    }
	    if($ztype != 'zip'){
	        die('只支持zip文件类型');
	    }
	    $dir = str_replace(DS,'/',$dir);
	    $filename = str_replace(DS,'/',$filename);
	    $files = array();
	    $this->getfiles($dir,$files);
	    $zip = new ZipArchive;
	    $res = $zip->open($filename, ZipArchive::CREATE);
	    if ($res === TRUE) {
	       foreach($files as $v){
		       	if(is_dir($v)){
		       		$zip->addEmptyDir(str_replace($dir.'/','',$v));
		       	}else{
		       		$zip->addFile($v,str_replace($dir.'/','./',$v));
		       	}
	        }
	        $zip->close();
	        return  'ok';
	    } else {
	        return  'failed';
	    }
	}
	
	/**
	 * 获取文件层级路径
	 */
	function getfiles($dir,&$files=array()){
	    if(!file_exists($dir) || !is_dir($dir)){return;}	
	    if(substr($dir,-1)=='/'){
	        $dir = substr($dir,0,strlen($dir)-1);
	    }
	    $_files = scandir($dir);
	    foreach($_files as $v){
	        if($v != '.' && $v!='..'){
	            if(is_dir($dir.'/'.$v)){
	                $this->getfiles($dir.'/'.$v,$files);
	            }else{
	                $files[] = $dir.'/'.$v;
	            }
	        }else{
	        	if(count($_files) == 2){
	        		$files[] = $dir;
	        	}
	        }       
	    }
	    return $files;
	}
	

	/**
	 * 删除除？以外的文件夹
	 * path 路径
	 * name 名称
	 */
	function zddel_dir($path,$name=''){
		$data = @scandir($path);
		if(@$data){
			foreach ($data as $k=>$v){
				if($v != "." && $v != ".." && $v!=$name){
					$fullpath = $path.DS.$v;
					if (is_dir($fullpath)){//判断给定文件名是否是一个目录
						$aa =self::deldir($fullpath);  //删除文件
					}
				}
			}
			if(@$aa){
				return true;
			}else{
				return false;
			}
		}
	}
	
/*****************************************测试*********************************************/
	
	/**
	 * 修改导出功能
	 * id 模板id
	 * gn 导出功能id字符串9,6,3,2
	 */
	function xgdcgn(){
		extract($this->_post()); 
		//$gn = '9,6,3,18,1';
		//$id = 5;
		if(@$gn){  		
			$mb =  C_base::M('admin.tempgl')->temp_s(array('id'=>@$id));
			if(@!$mb){exit('非法操作');};
			$mb_u = C_base::M('admin.tempgl')->temp_u(array('id'=>$id),array('gn'=>','.$gn));
			if($mb_u){
				exit('cg');
			}else{
				exit('error');
			}
		}else{
			exit('请选择功能');
		}
	}
}